package cn.tedu;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * Author：程Sir
 * Name： SpringTest01
 * Content:
 */
@Configuration // 表示是spring的配置类
@ComponentScan("cn.tedu") // 使用组件扫描的形式进Bean的管理
@PropertySource("classpath:jdbc.properties")
@MapperScan("cn.tedu.mapper") // 当spring容器启动时，回去扫码指定映射关系的包！
// 当扫描到指定包下的所有接口后，mybatis框架就会为所有的接口创建实现类对象！
public class SpringConfig {
//    @Value(value = "${jdbc.driver}") // 在注解参数的大括号中的值，是jdbc.properties文件中等号左侧的值
//    private String driver;
//    @Value(value = "${jdbc.url}")
//    private String url;
//    @Value(value = "${db.username}")
//    private String username;
//    @Value(value = "${db.password}")
//    private String password;
//    @Value("${db.maxActive}")
//    private Integer maxActive;
//    @Value("${db.initialSize}")
//    private Integer initialSize;

    @Bean
    public DruidDataSource druidDataSource(
            @Value(value = "${jdbc.url}") String url,
            @Value(value = "${db.username}") String username,
            @Value(value = "${db.password}")String password,
            @Value("${db.maxActive}") Integer maxActive,
            @Value("${db.initialSize}")Integer initialSize
    ){
//        BasicDataSource source = new BasicDataSource(); // apache 提供的数据库连接池对象
        DruidDataSource dataSource = new DruidDataSource();
        // 设置连接池的必要参数
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setMaxActive(maxActive);
        dataSource.setInitialSize(initialSize);

        return dataSource;
    }

    // 给MyBatis框架的核心工厂创建实例
    // 当MyBatis 进行相关sql操作时，就知道访问的数据源是什么了！
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DruidDataSource druidDataSource){
        // 给SqlSessionFactoryBean对象设置数据源
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(druidDataSource);
        return sessionFactoryBean;
    }

}
